package com.st.valid.jsr3.groupValid.controller;
import com.alibaba.fastjson.JSON;
import com.st.valid.jsr3.groupValid.entity.GroupRequestVo;
import com.st.valid.jsr3.groupValid.mark.AddGroup;
import com.st.valid.jsr3.groupValid.mark.UpdateGroup;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * jsr303 分组校验 控制器
 * @创建人: 放生
 * @创建时间: 2022/4/2
 * @描述: 这里要是指定了分组，实体类上的注解就是指定了分组的注解才生效，
 * 没有指定分组的默认不生效，要是没有指定分组，就是对没有指定分组的注解生效，指定分组的注解就不生效了
 * 可以在自定义的异常分组接口中继承Default类。所有没有写明group的都属于Default分组。
 */
@RestController
public class GroupVaildController {

    /**
     * 分组校验-添加
     *
     * @param grv
     * @param result
     * @return
     */
    @PostMapping("/save")
    public String save(@Validated(AddGroup.class) @RequestBody GroupRequestVo grv, BindingResult result){
        String message = getError(result);
        return Objects.isNull(message)?"save ok":message;
    }

    /**
     * 分组校验-修改
     *
     * @param grv
     * @param result
     * @return
     */
    @PostMapping("/update")
    public String update(@Validated(UpdateGroup.class) @RequestBody GroupRequestVo grv, BindingResult result){
        String message = getError(result);
        return Objects.isNull(message)?"update ok":message;
    }

    public String getError(BindingResult result){
        if(result.hasErrors()){
            Map<String,String> map = new HashMap<>();
            //1、获取校验的错误结果
            result.getFieldErrors().forEach((item)->{
                //FieldError 获取到错误提示
                String message = item.getDefaultMessage();
                //获取错误的属性的名字
                String field = item.getField();
                map.put(field,message);
            });
            return JSON.toJSONString(map);
        }
        return null;
    }

}
